<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/7/17 0017
 * Time: 15:06
 */

namespace addons\Jiguang\controller;

require_once(dirname(dirname(__FILE__))."/sdk/JPush/autoload.php");
use JPush\Client as JP;
class JPush 
{
    
     
    /**
     * 取得Client
     * @param string $type  实例化的类型
     * @return DefaultAcsClient
     */
    public function getClient($type = 'push' , $config_no = "") {
        // appKey     
        $appKey = addons_config('Jiguang.appKey' . $config_no);
        $masterSecret = addons_config('Jiguang.masterSecret' . $config_no);
    
        $Client= new JP($appKey, $masterSecret);
        switch ($type){
            case 'push':
                return  $Client->push();
            case 'report ':
                return  $Client->report();       
            case 'device':
                return  $Client->device();          
            case 'schedule':
                return  $Client->schedule();                
            default:
                return '实例化类型错误';
        }
    }
    /**
     * 简单推送-全体推
     * @author 晓风<215628355@qq.com>
     */
    public function setAlert($alert, string $config_no = ""){     
        $client = $this->getClient("push",$config_no);     
        try {
            return  $client->setPlatform('all')
                    ->addAllAudience()
                    ->setNotificationAlert($alert)
                    ->send();        
        } catch (\JPush\Exceptions\APIConnectionException $e) {
            // try something here
            throw new \Exception($e->getMessage());
        } catch (\JPush\Exceptions\APIRequestException $e) {
            // try something here
            throw new \Exception($e->getMessage());
        }
    }

    /**
     * 推送消息
     * @author 晓风<215628355@qq.com>
     * @param string|array $alias 接收人别名序列 接收三种类型传值：字符串单个别名/数组多个别名/若设置为true 则表示推送全体
     * @param string $alert 消息标题
     * @param string $message 消息内容
     * @param array $extras 透传
     * @param string $config_no 配置项的后缀 默认/1/2
     */

    public function  sendAliasMsg($alias,string $alert, string $message, array $extras = [] , string $config_no = ""){
        
         $client = $this->getClient("push",$config_no);     
         $extras[0] = "jiguang";
        // 完整的推送示例
        // 这只是使用样例,不应该直接用于实际生产环境中 !!
        try {
            $push = $client->setPlatform('all');
            
            // 一般情况下，关于 audience 的设置只需要调用 addAlias、addTag、addTagAnd  或 addRegistrationId
            // 这四个方法中的某一个即可，这里仅作为示例，当然全部调用也可以，多项 audience 调用表示其结果的交集
            // 即是说一般情况下，下面三个方法和没有列出的 addTagAnd 一共四个，只适用一个便可满足大多数的场景需求                
            // ->addTag(array('tag1', 'tag2'))
            // ->addRegistrationId($registration_id)
            if(true === $alias){
                $push = $push->addAllAudience();
            }else{
                $push = $push->addAlias($alias);
            }
            return  $push->setNotificationAlert($alert)
                ->iosNotification($message, array(
                    'sound' => 'sound.caf',
                    'badge' => '+1',
                    // 'content-available' => true,
                    // 'mutable-content' => true,
                    'category' => 'jiguang',
                    'extras' => $extras ?  json_encode($extras,JSON_UNESCAPED_UNICODE) : "{}",
                ))
                ->androidNotification($message, array(
                    'title' => $alert,
                    // 'builder_id' => 2,
                    'extras' =>  $extras ?  json_encode($extras,JSON_UNESCAPED_UNICODE) : "{}",
                ))
                ->message($message, array(
                    'title' => $message,
                    // 'content_type' => 'text',
                    'extras' =>  $extras ?  json_encode($extras,JSON_UNESCAPED_UNICODE) : "{}",
                ))
                ->options(array(
                    // sendno: 表示推送序号，纯粹用来作为 API 调用标识，
                    // API 返回时被原样返回，以方便 API 调用方匹配请求与返回
                    // 这里设置为 100 仅作为示例

                    // 'sendno' => 100,

                    // time_to_live: 表示离线消息保留时长(秒)，
                    // 推送当前用户不在线时，为该用户保留多长时间的离线消息，以便其上线时再次推送。
                    // 默认 86400 （1 天），最长 10 天。设置为 0 表示不保留离线消息，只有推送当前在线的用户可以收到
                    // 这里设置为 1 仅作为示例

                    // 'time_to_live' => 1,

                    // apns_production: 表示APNs是否生产环境，
                    // True 表示推送生产环境，False 表示要推送开发环境；如果不指定则默认为推送开发环境

                    'apns_production' => false,

                    // big_push_duration: 表示定速推送时长(分钟)，又名缓慢推送，把原本尽可能快的推送速度，降低下来，
                    // 给定的 n 分钟内，均匀地向这次推送的目标用户推送。最大值为1400.未设置则不是定速推送
                    // 这里设置为 1 仅作为示例

                    // 'big_push_duration' => 1
                ))
                ->send();              

        } catch (\JPush\Exceptions\APIConnectionException $e) {
            // try something here
            throw new \Exception($e->getMessage());
        } catch (\JPush\Exceptions\APIRequestException $e) {
            // try something here
            throw new \Exception($e->getMessage());
        }
    }
}